home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 18 / CU Amiga Magazine's Super CD-ROM 18 (1997)(EMAP Images)(GB)[!][issue 1998-01].iso / CUCD / Magazine / WiredWorld / THOR_2.5_upgrade / rexx / Others / BrowseTHOR.dopus5 next >
Text File  |  1997-09-15  |  21KB  |  948 lines

  1. /* BrowseTHOR.dopus5 by Troels Walsted Hansen <troelsh@powertech.no>
  2. ** $VER: BrowseTHOR.dopus5 1.7 (8.8.95)
  3. **
  4. ** This script allows you to browse a filedatabase in THOR from
  5. ** Dopus5. You may list systems, dirs and files in a Dopus5 lister
  6. ** and perform various functions. Delete works on both files and dirs,
  7. ** download works on files.
  8. **    The script is controlled through a message port which it opens.
  9. ** It is recommended that you use the Dopus5 button bank which is
  10. ** supplied along with the script.
  11. **
  12. ** Thanks to Matthias Bartosik for the idea for this script. :-)
  13. **
  14. ** History:
  15. ** ¯¯¯¯¯¯¯¯
  16. ** BrowseTHOR.dopus5 v1.0 (27.05.95)
  17. **  · first released version
  18. **
  19. ** BrowseTHOR.dopus5 v1.1 (27.05.95)
  20. **  · implemented delete of dirs and files
  21. **
  22. ** BrowseTHOR.dopus5 v1.5 (13.06.95)
  23. **  · fixed ugly resize at startup
  24. **  · implemented customhandler which means that the script will now handle
  25. **    doubleclicks, parent clicks and quitting when the Lister is closed!
  26. **  · all refreshes are now 'full' which means that the titlebar and the
  27. **    statusbar are updated, not just the Lister contents
  28. **
  29. ** BrowseTHOR.dopus5 v1.6 (15.06.95)
  30. **  · you get a button for quitting old if you start a new BrowseTHOR
  31. **  · busypointer and progressbar on delete and download
  32. **  · status window saying 'Reading system/directory', just like Dopus
  33. **  · maintenance on one or more systems implemented
  34. **  · search implemented. Search for a keyword or an exact hit across
  35. **    multiple systems in all dirs. Search in selected dirs within one
  36. **    system not implemented yet.
  37. **
  38. ** BrowseTHOR.dopus5 v1.7 (08.08.95)
  39. **  · implemented true 'parent' and 'root' (new in Dopus 5.11)
  40. **  · changed the BrowseTHOR button bar to use XHelvetica size 13 because I
  41. **    bought a nice CyberVision64 graphicscard and increased my resolution :)
  42. **  · changed the BrowseTHOR button bar to point to Dopus5:ARexx/BrowseTHOR.dopus5
  43. **    because it is more logical than THOR:Rexx/BrowseTHOR.dopus5.
  44. **  · implemented the 'path' event. This means you can enter a valid
  45. **    systemname:dirname in the lister path gadget, and the system/dir will
  46. **    be read.
  47. ** · ditched my ugly makestem() function in favor of Dopus 5.11's stem argument
  48. **   (a bit less ugly, but not much).
  49. */
  50.  
  51. /* Customize these first variables yourself */
  52.  
  53. pos = '241/16/652/373'        /* Windowspecs: leftedge/topedge/width/height */
  54.  
  55. showfilenumber = 'yes'        /* Whether or not to show the number of files in
  56.                               the directory as the size of the directory.
  57.                               Setting this to 'no' will improve dirlisting
  58.                               speed.                                       */
  59.  
  60. /* the rest is off limits */
  61.  
  62. options results
  63. options failat 31
  64.  
  65. /* needs Dopus 5, bbsread.library and rexxsupport.library functions */
  66.  
  67. p = address() || ' ' || show('P',,)
  68. dopusport = pos('DOPUS.',p)
  69.  
  70. if dopusport > 0 then dopusport = word(substr(p,dopusport),1)
  71. else
  72. do
  73.     say 'No Dopus port found!'
  74.     exit 10
  75. end
  76.  
  77. if ~show('p', 'BBSREAD') then
  78. do
  79.     address command
  80.         "run >nil: `GetEnv THOR/THORPath`bin/LoadBBSRead"
  81.         "WaitForPort BBSREAD"
  82.         if(rc ~= 0) then
  83.         do
  84.             address(dopusport)
  85.             dopus request '"Unable to access bbsread.library, exiting."' '_Ok'
  86.             exit
  87.         end
  88. end
  89.  
  90. if ~show('L', 'rexxsupport.library') then
  91. do
  92.     if ~addlib('rexxsupport.library', 0, -30, 0) then
  93.     do
  94.         address(dopusport)
  95.         dopus request '"ARexx support library not available, exiting."' '"_Ok"'
  96.         exit
  97.     end
  98. end
  99.  
  100. /* multiple BrowseTHORs will have to wait.... */
  101.  
  102. if(pos('BrowseTHOR', show('P',,)) ~= 0) then
  103. do
  104.     address(dopusport)
  105.     dopus request '"Only one BrowseTHOR at the time, please."' '_Ok|_Quit other'
  106.     if(rc = 0) then
  107.     do
  108.         address('BrowseTHOR')
  109.         QUIT
  110.     end
  111.     exit
  112. end
  113.  
  114. /* open our very own message port */
  115.  
  116. port = openport('BrowseTHOR')
  117.  
  118. /* open new lister */
  119.  
  120. address(dopusport)
  121.  
  122. lister new pos
  123. handle = result
  124.  
  125. /* show list of systems first */
  126.  
  127. call showsystems()
  128.  
  129. /* tell Dopus we want notifications about events concerning our Lister */
  130.  
  131. lister set handle handler 'BrowseTHOR'
  132. if(rc ~= 0) then exit 10
  133.  
  134. /* wait for commands */
  135.  
  136. do until status = 'CLOSE'
  137.     call waitpkt('BrowseTHOR')
  138.     packet = getpkt('BrowseTHOR')
  139.  
  140.     if packet ~= null() then
  141.     do
  142.         cmd = getarg(packet, 0)
  143.  
  144.         /*
  145.         trace results
  146.         say cmd
  147.         trace off
  148.         */
  149.  
  150.         if(cmd = 'doubleclick' | cmd = 'drop' | cmd = 'dropfrom' | cmd = 'path') then
  151.         do
  152.             Arg1 = getarg(Packet, 1) /* handle */
  153.             Arg2 = getarg(Packet, 2) /* entry */
  154.         end
  155.         interpret 'call ' || cmd || '()'
  156.         call reply(packet, 0)
  157.  
  158.         /* it seems Dopus has a habit of forgetting the custom handler?! */
  159.  
  160.         lister set handle handler 'BrowseTHOR'
  161.         if(rc ~= 0) then exit 10
  162.     end
  163. end
  164.  
  165. call closeport(port)
  166.  
  167. /* we're done for now, close Lister and exit */
  168.  
  169. lister close handle
  170. exit
  171.  
  172. /********************************************************************************/
  173.  
  174. /*** function for handling 'drop' event */
  175.  
  176. drop:
  177.     address(dopusport)
  178.     dopus request '"' || 'What use do I have for ' || Arg2 || '?' || '"' '_Upload it!'
  179.  
  180.     return
  181.  
  182. /*** function for handling 'dropfrom' event */
  183.  
  184. dropfrom:
  185.     address(dopusport)
  186.     dopus request '"' || 'What would you like me to do with ' || Arg2 || '?' || '"' '_Download it!'
  187.  
  188.     return
  189.  
  190. /*** function for handling 'doubleclick' event */
  191.  
  192. doubleclick:
  193.     select
  194.       when(system = '' & dir = '') then
  195.         do
  196.             system = Arg2
  197.             call showdirs()
  198.         end
  199.  
  200.         when(system ~= '' & dir = '') then
  201.         do
  202.             dir = Arg2
  203.             call showfiles()
  204.         end
  205.  
  206.         when(system ~= '' & dir ~= '') then
  207.         do
  208.             address(dopusport)
  209.             dopus request '"' || 'This ought to show detailed info about the file: ' || Arg2 || '"' '_Yeah!'
  210.         end
  211.  
  212.         otherwise nop
  213.     end
  214.  
  215.     return
  216.  
  217. /*** function for handling 'path' event */
  218.  
  219. path:
  220.     /* parse the entered data */
  221.  
  222.     posi = pos(':', Arg2)-1
  223.     if(posi = '-1' | Arg2 = '') then
  224.     do
  225.         call showsystems()
  226.         return
  227.     end
  228.     else system = left(Arg2, posi)
  229.  
  230.     dir = substr(Arg2, posi+2)
  231.     if(dir = '') then
  232.     do
  233.         call showdirs()
  234.         return
  235.     end
  236.  
  237.     call showfiles()
  238.     return
  239.  
  240. /*** function for handling 'active' event */
  241.  
  242. active:
  243.     /* do I have any use for this event? (will I ever receive it?) */
  244.  
  245.     address(dopusport)
  246.     dopus request '"' || 'How did you accomplish this?' || '"' '_You tell me!!'
  247.     return
  248.  
  249. /*** function for handling 'inactive' event */
  250.  
  251. inactive:
  252.     /* test if the Lister was closed */
  253.  
  254.    lister query handle visible
  255.     if(rc > 9) then
  256.     do
  257.         call Quit()
  258.         return
  259.     end
  260.  
  261.     system = ''
  262.     dir = ''
  263.  
  264.     return
  265.  
  266. /*** function for handling 'parent' event */
  267.  
  268. parent:
  269.     select
  270.         when(system ~= '' & dir = '') then
  271.         do
  272.             system = ''
  273.             call showsystems()
  274.         end
  275.  
  276.         when(system ~= '' & dir ~= '') then
  277.         do
  278.             dir = ''
  279.             call showdirs()
  280.         end
  281.  
  282.         otherwise nop
  283.     end
  284.  
  285.     return
  286.  
  287. /*** function for handling 'root' event */
  288.  
  289. root:
  290.     call showsystems()
  291.     return
  292.  
  293. /*** function for listing all systems */
  294.  
  295. showsystems:
  296.     system = ''
  297.     dir = ''
  298.  
  299.     address(dopusport)
  300.     lister clear handle
  301.     lister set handle display name
  302.     lister set handle title 'Select a system:'
  303.     lister set handle path ''
  304.  
  305.     address(bbsread)
  306.     GETBBSLIST stem BBSLIST
  307.     if(rc ~= 0) then
  308.     do
  309.         address(dopusport)
  310.         dopus request '"'BBSREAD.LASTERROR'"' '_Ok'
  311.         return
  312.     end
  313.  
  314.     address(dopusport)
  315.     lister set handle busy on
  316.  
  317.     do i=1 to BBSLIST.COUNT
  318.         lister add handle '"'BBSLIST.i'"' '0' '-1' '0' '-'
  319.         if(rc ~= 0) then
  320.         do
  321.             dopus request '"Something went wrong while adding systems to lister."' '_Ok'
  322.             return
  323.         end
  324.     end
  325.  
  326.     address(dopusport)
  327.     lister refresh handle full
  328.     lister set handle busy off
  329.  
  330.     return
  331.  
  332. /*** function for listing all dirs in a system */
  333.  
  334. showdirs:
  335.     dir = ''
  336.  
  337.     if(system = '') then
  338.     do
  339.         /* get the (first) selected system name */
  340.         address(dopusport)
  341.  
  342.         lister query handle numselfiles
  343.         if(result ~= 1) then
  344.         do
  345.             dopus request '"Please adjust number of selected systems to ONE."' '_Ok'
  346.             return
  347.         end
  348.  
  349.         lister query handle selfiles
  350.         system = strip(result, B, '"')
  351.     end
  352.  
  353.     address(bbsread)
  354.     GETFAREALIST bbsname '"'system'"' stem FAREALIST
  355.     if(rc ~= 0) then
  356.     do
  357.         address(dopusport)
  358.         dopus request '"'BBSREAD.LASTERROR'"' '_Ok'
  359.         return
  360.     end
  361.  
  362.     address(dopusport)
  363.     if(FAREALIST.COUNT = 0) then
  364.     do
  365.         dopus request '"This system has no filedatabase."' '_Ok'
  366.         lister select handle '"'system'"' off
  367.         lister refresh handle full
  368.         system = ''
  369.         dir = ''
  370.         return
  371.     end
  372.  
  373.     lister clear handle
  374.     lister set handle display name size
  375.     lister set handle title 'Select a dir:'
  376.     lister set handle path system || ':'
  377.     lister set handle busy on
  378.     lister set handle progress '-1' 'Reading system...'
  379.  
  380.     do i=1 to FAREALIST.COUNT
  381.         address(dopusport)
  382.         lister query handle abort
  383.         if(result) then break
  384.  
  385.         if(showfilenumber = 'yes') then
  386.         do
  387.             address(bbsread)
  388.             GETFAREADATA bbsname '"'system'"' fareaname '"'FAREALIST.i'"' stem FAREADATA
  389.             if(rc ~= 0) then
  390.             do
  391.                 address(dopusport)
  392.                 dopus request '"'BBSREAD.LASTERROR'"' '_Ok'
  393.             end
  394.  
  395.             if(FAREADATA.NUMFILES = 0) then dirsize = 0
  396.             else dirsize = FAREADATA.NUMFILES
  397.         end
  398.         else dirsize = '0'
  399.  
  400.         address(dopusport)
  401.         lister add handle '"'FAREALIST.i'"' dirsize '1' '0' '-'
  402.         if(rc ~= 0) then 
  403.         do
  404.             dopus request '"Something went wrong while adding dirs to lister."' '_Ok'
  405.             break
  406.         end
  407.     end
  408.  
  409.     address(dopusport)
  410.     lister refresh handle full
  411.     lister set handle busy off
  412.  
  413.     return
  414.  
  415. /*** function for listing all files in a dir */
  416.  
  417. showfiles:
  418.     if(dir = '') then
  419.     do
  420.         /* get the (first) selected dirname */
  421.         address(dopusport)
  422.  
  423.         lister query handle numseldirs
  424.         if(result ~= 1) then
  425.         do
  426.             dopus request '"Please adjust number of selected dirs to ONE."' '_Ok'
  427.             return
  428.         end
  429.  
  430.         lister query handle seldirs
  431.         dir = strip(result, B, '"')
  432.     end
  433.  
  434.     /* needs the number of the first file in the file area */
  435.  
  436.     address(bbsread)
  437.     GETFAREADATA bbsname '"'system'"' fareaname '"'dir'"' stem FAREADATA
  438.     if(rc ~= 0) then
  439.     do
  440.         address(dopusport)
  441.         dopus request '"'BBSREAD.LASTERROR'"' '_Ok'
  442.         return
  443.     end
  444.  
  445.     address(dopusport)
  446.     if(FAREADATA.NUMFILES = 0) then
  447.     do
  448.         dopus request '"This directory is empty."' '_Ok'
  449.         lister select handle '"'dir'"' off
  450.         lister refresh handle full
  451.         dir = ''
  452.         return
  453.     end
  454.  
  455.     lister clear handle
  456.     lister set handle display name size date comment
  457.     lister set handle title 'Select files:'
  458.     lister set handle path system || ':' || dir
  459.  
  460.     lister set handle busy on
  461.     lister set handle progress '-1' 'Reading directory...'
  462.  
  463.     filenr = FAREADATA.FIRSTFILE
  464.  
  465.     do until(filenr = 0)
  466.         address(dopusport)
  467.         lister query handle abort
  468.         if(result) then break
  469.  
  470.         drop FILE.  /* Important */
  471.  
  472.         address(bbsread)
  473.         READBRFILE bbsname '"'system'"' fareaname '"'dir'"' filenr tagsstem FILE
  474.         if(rc ~= 0) then
  475.         do
  476.             address(dopusport)
  477.             dopus request '"'BBSREAD.LASTERROR'"' '_Ok'
  478.             iterate
  479.         end
  480.  
  481.         filenr = result
  482.  
  483.         if(FILE.NAME ~= 'FILE.NAME') then
  484.         do
  485.             address(dopusport)
  486.             lister add handle FILE.NAME FILE.SIZE '-1' FILE.DATE 'rwed' FILE.DESCRIPTION.1
  487.             if(rc ~= 0) then
  488.             do
  489.                 dopus request '"Something went wrong while adding files."' '_Ok'
  490.                 break
  491.             end
  492.         end
  493.     end
  494.  
  495.     address(dopusport)
  496.     lister refresh handle full
  497.     lister set handle busy off
  498.  
  499.     return
  500.  
  501. /*** function for downloading selected files */
  502.  
  503. download:
  504.     /* get the selected filesnames */
  505.     address(dopusport)
  506.  
  507.     lister query handle numselfiles
  508.     if(result = 0) then
  509.     do
  510.         dopus request '"Please select at least one file."' '_Ok'
  511.         return
  512.     end
  513.  
  514.     drop files.
  515.     lister query handle selfiles stem files.
  516.     lister set handle busy on
  517.     lister set handle progress files.count 'Making download events...'
  518.  
  519.     EVENT.DIRECTORY = dir
  520.  
  521.     do i=0 to files.count-1
  522.         EVENT.FILENAME = files.i
  523.  
  524.         /* update the progress bar */
  525.  
  526.         address(dopusport)
  527.         lister set handle progress count i+1
  528.         lister set handle progress name EVENT.FILENAME
  529.  
  530.         lister query handle abort
  531.         if(result) then break
  532.  
  533.         /* write the download event */
  534.  
  535.         address(bbsread)
  536.         WRITEBREVENT bbsname '"'system'"' event 4 stem EVENT
  537.         if(rc ~= 0) then
  538.         do
  539.             address(dopusport)
  540.             dopus request '"'BBSREAD.LASTERROR'"' '_Ok'
  541.             iterate
  542.         end
  543.  
  544.         address(dopusport)
  545.         lister select handle '"'EVENT.FILENAME'"' off
  546.     end
  547.  
  548.     lister refresh handle full
  549.     lister set handle busy off
  550.  
  551.     return
  552.  
  553. /*** function for deleting selected dirs/files */
  554.  
  555. delete:
  556.     address(dopusport)
  557.  
  558.     /* check if called from systemlist */
  559.  
  560.     if(system = '' & dir = '') then
  561.     do
  562.         dopus request '"You cannot delete whole filedatabases, sorry."' '_Ok'
  563.         return
  564.     end
  565.  
  566.     /* dirs or files? */
  567.  
  568.     lister query handle numseldirs
  569.     mynumseldirs = result
  570.  
  571.     lister query handle numselfiles
  572.     mynumselfiles = result
  573.  
  574.     select
  575.         when(mynumseldirs ~= 0) then
  576.         do
  577.             /* get the selected dirnames */
  578.  
  579.             drop dirs.
  580.             lister query handle seldirs stem dirs.
  581.  
  582.             txt = 'Are you sure you want to delete ' || mynumseldirs || ' dir(s)?'
  583.             dopus request '"'txt'"' '_Yes|_Abort'
  584.             if(rc = 0) then return
  585.  
  586.             lister set handle busy on
  587.             lister set handle progress dirs.count 'Deleting dirs...'
  588.  
  589.             do i=0 to dirs.count-1
  590.                 /* update the progress bar */
  591.  
  592.                 address(dopusport)
  593.                 lister set handle progress count i+1
  594.                 lister set handle progress name dirs.i
  595.  
  596.              lister query handle abort
  597.              if(result) then break
  598.  
  599.                 /* mark the dir(s) as deleted */
  600.  
  601.                 address(bbsread)
  602.                 CONFIGFAREA bbsname '"'system'"' fareaname '"'dirs.i'"' deletefarea
  603.                 if(rc ~= 0) then
  604.                 do
  605.                     address(dopusport)
  606.                     dopus request '"'BBSREAD.LASTERROR'"' '_Ok'
  607.                     iterate
  608.                 end
  609.  
  610.                 address(dopusport)
  611.                 lister remove handle '"'dirs.i'"'
  612.             end
  613.  
  614.             lister refresh handle full
  615.             lister set handle busy off
  616.         end
  617.  
  618.         when(mynumselfiles ~= 0) then
  619.         do
  620.             /* get the selected filenames */
  621.  
  622.             drop files.
  623.             lister query handle selfiles stem files.
  624.  
  625.             txt = 'Are you sure you want to delete ' || mynumselfiles || ' file(s)?'
  626.             dopus request '"'txt'"' '_Yes|_Abort'
  627.             if(rc = 0) then return
  628.  
  629.             lister set handle busy on
  630.             lister set handle progress files.count 'Deleting files...'
  631.  
  632.             do i=0 to files.count-1
  633.                 FILE.NAME = files.i
  634.  
  635.                 /* update the progress bar */
  636.  
  637.                 address(dopusport)
  638.                 lister set handle progress count i+1
  639.                 lister set handle progress name FILE.NAME
  640.  
  641.              lister query handle abort
  642.              if(result) then break
  643.  
  644.                 /* get the number of the file */
  645.  
  646.                 address(bbsread)
  647.                 SEARCHBRFILE bbsname '"'system'"' stem SRESULT fareaname '"'dir'"' search '"'FILE.NAME'"' NAME
  648.                 if(rc ~= 0) then
  649.                 do
  650.                     address(dopusport)
  651.                     dopus request '"'BBSREAD.LASTERROR'"' '_Ok'
  652.                     iterate
  653.                 end
  654.  
  655.                 if(SRESULT.FILEAREA.COUNT = 0) then iterate
  656.  
  657.                 /* mark file as deleted */
  658.  
  659.                 address(bbsread)
  660.                 WRITEBRFILE bbsname '"'system'"' fareaname '"'dir'"' stem FILE updatefilenr '"'SRESULT.FILE.1.1'"' deletefile
  661.                 if(rc ~= 0) then
  662.                 do
  663.                     address(dopusport)
  664.                     dopus request '"'BBSREAD.LASTERROR'"' '_Ok'
  665.                     iterate
  666.                 end
  667.  
  668.                 address(dopusport)
  669.                 lister remove handle '"'FILE.NAME'"'
  670.             end
  671.  
  672.             lister refresh handle full
  673.             lister set handle busy off
  674.         end
  675.  
  676.         otherwise
  677.         do
  678.             dopus request '"Please select at least one directory or file."' '_Ok'
  679.             return
  680.         end
  681.     end
  682.  
  683.     return
  684.  
  685. /*** function for performing maintenance on the selected system(s) */
  686.  
  687. maintenance:
  688.     address(dopusport)
  689.  
  690.     if(system ~= '') then
  691.     do
  692.         dopus request '"Maintenance should be performed from the systems list."' '_Ok|_Show systems'
  693.         if(rc = 0) then call showsystems()
  694.         return
  695.     end
  696.  
  697.     /* get the selected systemnames */
  698.  
  699.     lister query handle numselfiles
  700.     if(result = 0) then
  701.     do
  702.         dopus request '"Please select at least one system."' '_Ok'
  703.         return
  704.     end
  705.  
  706.     dopus request '"' 'Are you sure you want to clean up at ' || result || ' system(s)?' || '"' '_Proceed|_Abort'
  707.     if(rc = 0) then return
  708.  
  709.     drop files.
  710.     lister query handle selfiles stem files.
  711.     lister set handle busy on
  712.     lister set handle progress files.count 'Cleaning up...'
  713.  
  714.     do i=0 to files.count-1
  715.         /* update the progress bar */
  716.  
  717.         address(dopusport)
  718.         lister set handle progress count i+1
  719.         lister set handle progress name files.i
  720.  
  721.         lister query handle abort
  722.         if(result) then break
  723.  
  724.         /* pack the filedatabase */
  725.  
  726.         address(bbsread)
  727.         PACKDATAFILE bbsname '"'files.i'"' FILEDATA
  728.         if(rc ~= 0) then
  729.         do
  730.             address(dopusport)
  731.             lister set handle busy off
  732.             dopus request '"'BBSREAD.LASTERROR'"' '_Ok'
  733.             return
  734.         end
  735.  
  736.         address(dopusport)
  737.         lister select handle '"'files.i'"' off
  738.     end
  739.  
  740.     address(dopusport)
  741.     lister refresh handle full
  742.     lister set handle busy off
  743.  
  744.     return
  745.  
  746. /*** function for searching for files */
  747.  
  748. search:
  749.     address(dopusport)
  750.  
  751.     select
  752.       when(system = '' & dir = '') then nop
  753.  
  754.         when(system ~= '' & dir = '') then
  755.         do
  756.             dopus request '"Search for pattern in selected dirs...NOT IMPLEMENTED YET."' '_Darn'
  757.          return
  758.         end
  759.  
  760.         when(system ~= '' & dir ~= '') then
  761.         do
  762.             dopus request '"You can''t search inside files, silly."' '_Okay'
  763.          return
  764.         end
  765.  
  766.         otherwise return
  767.     end
  768.  
  769.     if(pattern = 'PATTERN') then pattern = 'THOR'
  770.  
  771.     dopus getstring '"Enter search pattern..."' '50' '"'pattern'"' '_Keyword|_Exact|_Cancel'
  772.     if(result = '' | dopusrc = 0) then return
  773.  
  774.     pattern = result
  775.  
  776.     if(dopusrc = 2) then str = 'NAME'
  777.     else str = 'KEYWORD'
  778.  
  779.     /* get the selected systemnames */
  780.  
  781.     lister query handle numselfiles
  782.     if(result = 0) then
  783.     do
  784.         dopus request '"Please select at least one system."' '_Ok'
  785.         return
  786.     end
  787.  
  788.     drop files.
  789.     lister query handle selfiles stem files.
  790.     lister set handle busy on
  791.  
  792.     do i=0 to files.count-1
  793.         /* update the status window */
  794.  
  795.         address(dopusport)
  796.         lister set handle progress '-1' 'Searching for pattern at ' || files.i || '...'
  797.  
  798.         lister query handle abort
  799.         if(result) then break
  800.  
  801.         /* do the searching */
  802.  
  803.         call searchsystem()
  804.  
  805.         /* open requester which will allow the user to proceed to searching the next system */
  806.  
  807.         if(i ~= files.count-1) then
  808.         do
  809.             address(dopusport)
  810.             dopus request '"Press next to proceed to next system..."' '_Next|_Abort'
  811.             if(rc = 0) then leave i        /* +/- 1 ???? */
  812.         end
  813.     end
  814.  
  815.     address(dopusport)
  816.     lister set handle busy off
  817.  
  818.     return
  819.  
  820. /*** function for searching for a pattern at one specific system */
  821.  
  822. searchsystem:
  823.     address(bbsread)
  824.     SEARCHBRFILE bbsname '"'files.i'"' stem SRESULT search '"'pattern'"' str
  825.     if(rc ~= 0) then
  826.     do
  827.         address(dopusport)
  828.         dopus request '"'BBSREAD.LASTERROR'"' '_Ok'
  829.         return
  830.     end
  831.  
  832.     if(result > 0) then
  833.     do
  834.         address(dopusport)
  835.         lister clear handle
  836.         lister set handle display name size date comment
  837.         lister set handle title 'Select files:'
  838.         lister set handle path files.i || ':' || 'Found_in_search'
  839.  
  840.         system = files.i
  841.  
  842.         do f=1 to SRESULT.FILEAREA.COUNT
  843.             /* check the status window abort button */
  844.  
  845.             address(dopusport)
  846.             lister query handle abort
  847.             if(result) then break
  848.  
  849.             do j=1 to SRESULT.FILE.f.COUNT
  850.                 drop FILE.    /* Important */
  851.  
  852.                 address(bbsread)
  853.                 say bbsname '"'files.i'"' fareaname '"'SRESULT.FILEAREA.f'"' filenr SRESULT.FILE.f.j tagsstem FILE datastem DATA
  854.                 READBRFILE bbsname '"'files.i'"' fareaname '"'SRESULT.FILEAREA.f'"' filenr SRESULT.FILE.f.j tagsstem FILE datastem DATA
  855.                 if(rc ~= 0) then
  856.                 do
  857.                     address(dopusport)
  858.                     dopus request '"'BBSREAD.LASTERROR'"' '_Ok'
  859.                     return
  860.                 end
  861.  
  862.  
  863.                 if(bitand(DATA.FLAGS, '00000001'x) ~= '00000001'x) then
  864.                 do
  865.                     address(dopusport)
  866.                     lister add handle FILE.NAME FILE.SIZE '-1' FILE.DATE 'rwed' FILE.DESCRIPTION.1
  867.                     if(rc ~= 0) then
  868.                     do
  869.                         dopus request '"Something went wrong while adding files."' '_Ok'
  870.                         break
  871.                     end
  872.                 end
  873.             end
  874.         end
  875.     end
  876.     else
  877.     do
  878.         address(dopusport)
  879.         dopus request '"No files found."' '_Ok'
  880.         return
  881.     end
  882.  
  883.     address(dopusport)
  884.     lister refresh handle full
  885.  
  886.     return
  887.  
  888. /*** function for searching for a msg in a FileInfo conference and displaying it with Dopus' reader */
  889.  
  890. showfileinfo:
  891.     /* get the selected filesnames */
  892.     address(dopusport)
  893.  
  894.     dopus request '"Waiting for Leo to finish SEARCHBRMESSAGE..."' '_Ok'
  895.     return
  896.  
  897.     lister query handle numselfiles
  898.     if(result = 0) then
  899.     do
  900.         dopus request '"Please select at least one file."' '_Ok'
  901.         return
  902.     end
  903.  
  904.     drop files.
  905.     lister query handle selfiles stem files.
  906.     lister set handle busy on
  907.     lister set handle progress files.count 'Searching for FileInfo...'
  908.  
  909.     EVENT.DIRECTORY = dir
  910.  
  911.     do i=0 to files.count-1
  912.         EVENT.FILENAME = files.i
  913.  
  914.         /* update the progress bar */
  915.  
  916.         address(dopusport)
  917.         lister set handle progress count i+1
  918.         lister set handle progress name EVENT.FILENAME
  919.  
  920.         lister query handle abort
  921.         if(result) then break
  922.  
  923.         /* write the download event */
  924.  
  925.         address(bbsread)
  926.         WRITEBREVENT bbsname '"'system'"' event 4 stem EVENT
  927.         if(rc ~= 0) then
  928.         do
  929.             address(dopusport)
  930.             dopus request '"'BBSREAD.LASTERROR'"' '_Ok'
  931.             iterate
  932.         end
  933.  
  934.         address(dopusport)
  935.         lister select handle '"'EVENT.FILENAME'"' off
  936.     end
  937.  
  938.     lister refresh handle full
  939.     lister set handle busy off
  940.  
  941.    return
  942.  
  943. /*** function for ending script */
  944.  
  945. quit:
  946.     status = 'CLOSE'
  947.     return
  948.